// 请帮我创建一个Node.js + TypeScript的用户认证服务类，具体要求：

// **功能需求：**
// 1. 用户登录功能
//    - 输入：用户名、密码
//    - 验证密码正确性
//    - 返回用户基本信息（不含密码）

// 2. 用户注册功能  
//    - 输入：用户名、密码、角色
//    - 检查用户名是否已存在
//    - 密码加密存储
//    - 返回注册结果

// **技术要求：**
// - 使用TypeScript编写
// - 使用bcrypt进行密码加密
// - 数据库操作封装
// - Promise异步处理
// - 完整的错误处理

// **数据结构：**
// - 用户表包含：id、username、password、role
// - 用户角色：normal（普通用户）、admin（管理员）

import database from '../../../utils/database'
import bcrypt from 'bcrypt';

// 数据库中用户表的表名
const tableName = 'users';

// 定义用户信息接口
interface UserInfo {
    id: number;
    username: string;
    role: 'normal' | 'admin';
}

// 用户服务类
export class UsersService {
    // 登录方法
    login(username: string, password: string): Promise<UserInfo> {
        return new Promise((res, rej) => {
            // 读取数据库用户数据
            database.queryData(
                tableName,
                ['id', 'username', 'role', 'password'],
                `username = '${username}'`,
                (data) => {
                    // DB 返回的是数组，直接取其中一个即可(只有一个元素)
                    let result = data.result.pop();
                    
                    // 如果用户数据存在，则进行后续验证
                    if (result != null) {
                        let p = result.password;
                        // 验证密码
                        let success = bcrypt.compareSync(password, p);
                        
                        if (success) {
                            // 登录成功，返回用户数据
                            res({
                                id: result.id,
                                username: result.username,
                                role: result.role
                            });
                        } else {
                            rej('密码错误，请重新输入');
                        }
                    } else {
                        rej('请输入正确的账户信息');
                    }
                }
            );
        });
    }

    // 注册方法
    signUp(username: string, password: string, role: string): Promise<null> {
        return new Promise((res, rej) => {
            // 检查是否已经有用户存在
            database.queryData(
                tableName,
                ['id'],
                `username = '${username}'`,
                (data) => {
                    let result = data.result.pop();
                    
                    // 如果用户已经存在，则不能重复注册
                    if (result != null) {
                        rej('用户名已存在，请更换其他用户名注册');
                    } else {
                        // 对密码进行加密
                        let crypt = bcrypt.hashSync(password, 10);
                        
                        // 将密码加密后的用户数据存储到数据库中
                        database.insertData(
                            tableName,
                            ['username', 'password', 'role'],
                            [username, crypt, role],
                            data => {
                                if (data) {
                                    res(null);
                                } else {
                                    rej('注册失败，请稍后重试');
                                }
                            }
                        );
                    }
                }
            );
        });
    }
}

// 导出服务类
export default new UsersService();
    